<?php
class Util {
	static function dt_doctrine2ar($dataRecebida) {
		$dt = array();
		$parts = explode(' ',$dataRecebida);
		$data = $parts[0];
		$hora = $parts[1];
		$dt_parts = explode('-',$data);
		$dt['ano'] = $dt_parts[0];
		$dt['mes'] = $dt_parts[1];
		$dt['dia'] = $dt_parts[2];
		$hr_parts = explode(':',$hora);
		$dt['hora'] = $hr_parts[0];
		$dt['minuto'] = $hr_parts[1];
		$dt['segundo'] =
		isset($hr_parts[2])
		? $hr_parts[2]
		: '00';
		return $dt;
	}



	static function cepSemMascara($cep)
	{
		$parts = explode('-',$cep);
		return (int)$parts[0].$parts[1];
	}

	static function dt_doctrine2time($dataRecebida) {
		$dt = self::dt_doctrine2ar($dataRecebida);
		return mktime(
		$dt['hora'],
		$dt['minuto'],
		$dt['segundo'],
		$dt['mes'],
		$dt['dia'],
		$dt['ano']
		);
	}

	/**
	 * @param string|int $Year
	 * Displays <a href="http://br.php.net/easter_date">php.net</a>
	 * @link http://br.php.net/easter_date
	 */
	public static function retornarPascoa($Year)
	{
		/*
		G is the Golden Number-1
		H is 23-Epact (modulo 30)
		I is the number of days from 21 March to the Paschal full moon
		J is the weekday for the Paschal full moon (0=Sunday,
		1=Monday, etc.)
		L is the number of days from 21 March to the Sunday on or before
		the Paschal full moon (a number between -6 and 28)
		*/

		$G = $Year % 19;
		$C = (int)($Year / 100);
		$H = (int)($C - (int)($C / 4) - (int)((8*$C+13) / 25) + 19*$G + 15) % 30;
		$I = (int)$H - (int)($H / 28)*(1 - (int)($H / 28)*(int)(29 / ($H + 1))*((int)(21 - $G) / 11));
		$J = ($Year + (int)($Year/4) + $I + 2 - $C + (int)($C/4)) % 7;
		$L = $I - $J;
		$m = 3 + (int)(($L + 40) / 44);
		$d = $L + 28 - 31 * ((int)($m / 4));
		$y = $Year;
		$E = mktime(0,0,0, $m, $d, $y);

		return $E;
	}

	/**
	* @author Rodrigo Régis Palmeira <regisbsb@gmail.com>
	* @param string $ano - ano em que se quer calcular os feriados
	* @return array com feriados nacionais do ano informado do ano (fixo e moveis)
	*/
	public static function retornarFeriados($ano)
	{
		$dia = 86400;
		$datas = array();
		$datas['pascoa'] = self::retornarPascoa($ano);
		$datas['sexta_santa'] = $datas['pascoa'] - (2 * $dia);
		$datas['carnaval'] = $datas['pascoa'] - (47 * $dia);
		$datas['corpus_cristi'] = $datas['pascoa'] + (60 * $dia);

		$feriados = array (
			'Ano Novo'						=> '01/01/'.date('Y'),
			'Carnaval'						=> date('d/m/Y',$datas['carnaval']),
			'Sexta-Feira Santa'				=> date('d/m/Y',$datas['sexta_santa']),
			'Páscoa'						=> date('d/m/Y',$datas['pascoa']),
			'Tiradentes'					=> '21/04/'.date('Y'),
			'Dia do Trabalhador'			=> '01/05/'.date('Y'),
			'Corpus Cristi'					=> date('d/m/Y',$datas['corpus_cristi']),
			'Dia da Independência'			=> '07/09/'.date('Y'),
			'Nossa Senhora de Aparecida'	=> '12/10/'.date('Y'),
			'Dia de Finados'				=> '02/11/'.date('Y'),
			'Proclamação da República'		=> '15/11/'.date('Y'),
			'Natal'							=>	'25/12/'.date('Y')
		);
		return $feriados;
	}

	/**
	 * @author Rodrigo Régis Palmeira <regisbsb@gmail.com>
	 * @param int $soma - dias a serem somados
	 * @param bolean $uteis - considera dias uteis - default false
	 * @param date $data - data inicial válida - default date('d/m/Y')
	 * @param string $format - formato de data a ser retornado
	 * @return string - data em formado d/m/Y
	 */
	public static function somarData($soma, $uteis = false, $data = null, $format = 'd/m/Y')
	{
		$ar = explode("/",$data);
		if (!empty($ar[0]) && !empty($ar[1]) && !empty($ar[2]))
		{
			if (checkdate($ar[1],$ar[0],$ar[2]))
			{
				$dia = $ar[0];
				$mes = $ar[1];
				$ano = $ar[2];
			}
			else
			{
				return "Informe uma data válida!";
			}
		}
		else
		{
			$dia = date('d');
			$mes = date('m');
			$ano = date('Y');
		}

		if ($uteis)
		{
			$contDia = 0;
			$qtdDiasUteis = 0;

			while ($qtdDiasUteis < $soma)
			{
				$contDia++;

				if (($dias_da_semana = gmdate('w', strtotime('+'.$contDia.' day', mktime(0, 0, 0, $mes, $dia, $ano))) ) != '0' &&
					 $dias_da_semana != '6'  &&
					 (!in_array(date('d/m/Y', mktime(0, 0, 0, $mes, $dia + $contDia, $ano)),self::retornarFeriados($ano))))
				{
					$qtdDiasUteis++;
				}
			}
			$novaData = date($format, mktime(0, 0, 0, $mes, $dia + $contDia, $ano));
		}
		else
		{
			$novaData = date($format, mktime(0, 0, 0, $mes, $dia + $soma, $ano));
		}

		return $novaData;
	}

  public static function comparaDatas( $data1, $data2,$comparacao = '>=' ) {
    $i_ar = explode("/",$data1);
    $f_ar = explode("/",$data2);

    $i_dia = $i_ar[0];
    $i_mes = $i_ar[1];
    $i_ano = $i_ar[2];

    $f_dia = $f_ar[0];
    $f_mes = $f_ar[1];
    $f_ano = $f_ar[2];

    $dt1 = mktime(0, 0, 0, $i_mes, $i_dia, $i_ano); //timestamp
    $dt2 = mktime(0, 0, 0, $f_mes, $f_dia, $f_ano); //timestamp

    if (($comparacao == '>=' && $dt1 >= $dt2) || ($comparacao == '>' && $dt1 > $dt2 ) || ($comparacao == '==' && $dt1 == $dt2 ))
    {
      return true;
    }
    else
    {
      return false;
    }
  }

  public static function difencaDeDiasEntreDatas( $data1, $data2, $uteis = false) {
    $i_ar = explode("/",$data1);
    $f_ar = explode("/",$data2);

    $i_dia = $i_ar[0];
    $i_mes = $i_ar[1];
    $i_ano = $i_ar[2];

    $f_dia = $f_ar[0];
    $f_mes = $f_ar[1];
    $f_ano = $f_ar[2];

    $dt1 = mktime(0, 0, 0, $i_mes, $i_dia, $i_ano); //timestamp
    $dt2 = mktime(0, 0, 0, $f_mes, $f_dia, $f_ano); //timestamp

    if ( $dt1 <= $dt2 ) {  $dif = $dt2 - $dt1; }else {   $dif = $dt1 - $dt2; }

    $soma = ($dif/60/60/24);

    if($uteis){ 	$soma	= self::retornaDiasUteis($soma, $data1);   }

    return $soma;
  }

  public static function retornaDiasUteis($dias, $data)
  {
    $ar = explode("/",$data);
    if (checkdate($ar[1],$ar[0],$ar[2]))
    {
      $dia = $ar[0];
      $mes = $ar[1];
      $ano = $ar[2];
    }

    $contDia = 0;
    $qtdDiasUteis = 0;

    while ($contDia <= $dias)
    {
      $dias_da_semana = gmdate('w', strtotime('+'.$contDia.' day', mktime(0, 0, 0, $mes, $dia, $ano)));

      if ( ($dias_da_semana != 0) && ($dias_da_semana != 6) &&
           (!in_array(date('d/m/Y', mktime(0, 0, 0, $mes, ($dia+$contDia), $ano)), self::retornarFeriados($ano)))
          )
      {
        $qtdDiasUteis++;
      }
      $contDia++;
    }
    return $qtdDiasUteis;
  }


	public static function formatarCPF_CNPJ($campo, $formatado = true)
	{
		//retira formato
		$codigoLimpo = str_replace(array('[',"'",'-','.','/'), '', $campo);// ereg_replace("[' '-./ t]",'',$campo);
		// pega o tamanho da string menos os digitos verificadores
		$tamanho = (strlen($codigoLimpo) -2);
		//verifica se o tamanho do código informado é válido
		if ($tamanho != 9 && $tamanho != 12){
			return false;
		}

		if ($formatado){
			// seleciona a máscara para cpf ou cnpj
			$mascara = ($tamanho == 9) ? '###.###.###-##' : '##.###.###/####-##';

			$indice = -1;
			for ($i=0; $i < strlen($mascara); $i++) {
				if ($mascara[$i]=='#') $mascara[$i] = $codigoLimpo[++$indice];
			}
			//retorna o campo formatado
			$retorno = $mascara;

		}else{
			//se não quer formatado, retorna o campo limpo
			$retorno = $codigoLimpo;
		}

		return $retorno;
	}

  public static function validaCPF($value)
  {
    //Retira os formatos
    $strCPF = preg_replace('/[^0-9]/', '', $value);
    //Verifica o tamanho
    if (strlen($strCPF)<>11) {
      return false;
    } else {

      //Verifica se todos digitos sao iguais. Ex: 11111111111
      for ($i = 0; $i < 10; $i++){
        if ($strCPF == str_pad('', 11, $i)){
          return false;
        }
      }

      //Verifica primeiro digito verificador
      $intSoma = 0;
      for ($i = 1; $i < strlen($strCPF) - 1; $i++) {
        $intSoma += ((int) $strCPF[$i - 1]) * (strlen($strCPF) - $i);
      }

      $intDv = 11 - ($intSoma % 11);
      if ($intDv >= 10) {
        $intDv = 0;
      }
      if ($intDv <> ((int) $strCPF[strlen($strCPF) - 2])) {
        return false;
      } else {

        //Verifica segundo digito verificador
        $intSoma = 0;
        for ($i = 1; $i < strlen($strCPF); $i++) {
          $intSoma += ((int) $strCPF[$i - 1]) * (strlen($strCPF) - $i + 1);
        }
        $intDv = 11 - ($intSoma % 11);
        if ($intDv >= 10) {
          $intDv = 0;
        }
        return  $intDv == ((int) $strCPF[strlen($strCPF) - 1]);
      }
    }
  }

	/**
	 * @author Rodrigo Régis Palmeira
	 * @link http://www.rodrigoregis.com.br
	 * @param string $html
	 * @return file.xls
	 */
	public static function htmltoXLS($html, $nome='file.xls')
	{
		header ("Last-Modified: " . gmdate("D,d M YH:i:s") . " GMT");
		header ("Cache-Control: no-cache, must-revalidate");
		header ("Pragma: no-cache");
		header ("Content-type: application/vnd.ms-excel");
		header ("Content-Disposition: attachment; filename=\"{$nome}\"" );
		header ("Content-Description: PHP Generated Data" );

		echo $html;
		exit();
	}

  /**
    * @author Rodrigo Régis Palmeira
    * @link http://www.rodrigoregis.com.br
    * @param string $html
    * @return file.doc
    */
  public static function htmltoDOC($html, $nome = 'file.doc', $destino = null)
  {
  	if (!$destino)
  	{
  		header("Content-type: application/vnd.ms-word");
  		header("Content-type: application/force-download");
  		header("Content-Disposition: attachment; filename=\"{$nome}\"");
  		header("Pragma: no-cache");
  		echo $html;
  		exit();
  	}
  	else
  	{
  		file_put_contents($destino.'/'.$nome, $html);
  		//exit();
  	}
  }

	/**
	 * Função para formatar qualquer mascara.
	 * A mascara deve ser informada com # Ex: ##/##/####
	 * @param string $string
	 * @param string $format
	 */
	public static function formatAll($string, $mascara)
	{
	    if($string)
	    {
    	    $stringLimpa = str_replace("[][><}{)(:;,!?*%&#@-/\]", "", $string);

    	    $indice = -1;
    		for ($i=0; $i < strlen($mascara); $i++) {
    			if ($mascara[$i] == '#')
    			    $mascara[$i] = $stringLimpa[++$indice];
    		}

    		//retorna a string formatada
    		return $mascara;
	    }
	}

	public static function valorProduto($object)
	{
            if($object['ItemPromocao'] && $object['ItemPromocao']['ativo'])
            {
                $valorOriginal = $object['ItemPromocao']['vl_promo'];
            }
            else
            {
                $valorOriginal  = $object['vl_item'];
            }
		$valor	= number_format($valorOriginal, 2, ",", ".");

            if($object['vl_por_kg'])
            {
                    $valor	.= " (Kg)";
            }

            return "R$ ".$valor;
	}

	public static function tagCloud($tags, $url)
	{
		$tags	= explode(',', $tags);

                $keys = array_keys($tags);
                shuffle($keys);

		foreach($tags as $k => $t)
		{
                    if($k == 6) $k = 1;

                    $key    = $keys[$k];

                    echo "<span class=tag".$key."><a href='".$url."?q=".$t."'>".$t."</a></span> ";
		}

	}

	public static function getHtmlContent(sfActions $action, $layout = false)
	{
	    sfConfig::set('sf_web_debug', false);
	    $action->setLayout($layout);
	    $context = $action->getContext();
	    //clear http headers
	    $context->getResponse()->clearHttpHeaders();

	    /*get the view, execute n render with variables*/
	    $view = $context->getController()->getView($action->getModuleName(), $action->getActionName(), 'Success');

	    $view->execute();
	    $view->getAttributeHolder()->add($action->getVarHolder()->getAll());

	    $content = $view->render();

	    return $content;
	}



	public static function removerCaracter($string){
	    $string = ereg_replace("[áàâãª]","a",$string);
	    $string = ereg_replace("[ÁÀÂÃ]","A",$string);
	    $string = ereg_replace("[éèê]","e",$string);
	    $string = ereg_replace("[ÉÈÊ]","E",$string);
	    $string = ereg_replace("[íì]","i",$string);
	    $string = ereg_replace("[ÍÌ]","I",$string);
	    $string = ereg_replace("[óòôõº]","o",$string);
	    $string = ereg_replace("[ÓÒÔÕ]","O",$string);
	    $string = ereg_replace("[úùû]","u",$string);
	    $string = ereg_replace("[ÚÙÛ]","U",$string);
	    $string = ereg_replace("ç","c",$string);
	    $string = ereg_replace("Ç","C",$string);
	    $string = ereg_replace("[][><}{)(:;,!?*%~^`&#@-]","",$string);
	    $string = ereg_replace(" ","_",$string);

	    return $string;
	}

	public static function cleanText($text, $decode = false)
	{
		$text	= ($decode) ? utf8_decode($text) : $text;

		return Util::removerCaracter(strtolower($text));
	}

	/**
	 * Gera um relatório a partir de um html de acordo com o formato informado
	 * @author Rodrigo Régis Palmeira <regisbsb@gmail.com>
	 * @param string $html - dados do relatório
	 * @param string $formato - html, xls, doc, pdf> default = html
	 */
	public static function gerarRelatorio($html, $formato = 'html', $nome_arquivo = 'relatorio')
	{
		$formato = strtolower($formato);

		if (($formato) == 'xls')
			return self::htmltoXLS($html, $nome_arquivo.'.xls');

		if (($formato) == 'doc')
			return self::htmltoDOC($html, $nome_arquivo.'.doc');

//		if (($formato) == 'html')
//			return $html;

//		if (($formato) == 'pdf')
//			return new MPDF($nome_arquivo.'.pdf', $html, null, null, 'D', 'L');
	}

	public static function converteData($data)
	{
		$data_nova = implode(preg_match("~\/~", $data) == 0 ? "/" : "-", array_reverse(explode(preg_match("~\/~", $data) == 0 ? "-" : "/", $data)));
		return $data_nova;
	}
}
?>